package com.hsu.hsurpc.proxy;

import com.github.javafaker.Faker;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * Mock 服务代理类，使用 JDK 动态代理
 * @Author Hsu琛君珩
 * @Date 2024-09-19 11:30
 * @Description
 * @Version: v1.0.0
 */
@Slf4j
public class MockServiceProxy implements InvocationHandler {

    // Faker 实例，用于生成伪造数据
    private final Faker faker = new Faker();

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 获取方法的返回类型，生成对应的 Mock 值
        Class<?> methodReturnType = method.getReturnType();
        log.info("Mock 服务被调用: {}", method.getName());
        return getDefaultObject(methodReturnType);
    }

    /**
     * 根据返回值类型生成默认的模拟对象
     *
     * @param type 方法的返回类型
     * @return 返回类型的默认值
     */
    private Object getDefaultObject(Class<?> type) {
        // 处理基本类型
        if (type.isPrimitive()) {
            if (type == boolean.class) {
                return false;
            } else if (type == short.class) {
                return (short) 0;
            } else if (type == int.class) {
                return 0;
            } else if (type == long.class) {
                return 0L;
            }
        }
        // 处理常见的对象类型
        if (type == String.class) {
            return faker.name().fullName(); // 生成随机的名字
        } else if (type == List.class) {
            return Collections.emptyList(); // 返回空列表
        } else if (type == Map.class) {
            return Collections.emptyMap(); // 返回空 Map
        } else if (type == Integer.class) {
            return faker.number().randomDigit(); // 生成随机数字
        } else if (type == Boolean.class) {
            return faker.bool().bool(); // 生成随机布尔值
        } else if (type == Double.class) {
            return faker.number().randomDouble(2, 1, 100); // 生成随机 Double
        } else if (type == Long.class) {
            return faker.number().randomNumber(); // 生成随机 Long
        }
        // 对象类型，默认返回 null
        return null;
    }
}
